home *** CD-ROM | disk | FTP | other *** search
- /*
- Copyright 2009 Foxmarks Inc.
-
- foxmarks-discover.js: Classes related to SERP and sim sites
-
- */
-
- var Cc = Components.classes;
- var Ci = Components.interfaces;
-
- var FoxmarksSimSites = {
- DRIFTSITE: "/site/?cid=xmfx&url=",
- SIMSITE: "/internal/visitsite?cid=xmfx&id=",
- TOPICSITE: "/topic/",
- WRITEREVIEW: "/review/edit/?cid=xmfx&url=",
- _iconLoaded: false,
- observe: function(subject, topic, data) {
- if(data == "extensions.xmarks.enableSimSite"){
- if(this.settings.simsiteEnabled && !this._iconLoaded){
- this.addIcon();
- } else {
- var image = document.getElementById("foxmarks-ss-button");
- image.parentNode.removeChild(image);
- this._iconLoaded = false;
- }
- }
- },
- addIcon: function(){
- var staricon = document.getElementById("star-button");
- if(staricon && !this._iconLoaded){
- var img = document.createElement('image');
- img.setAttribute('id', "foxmarks-ss-button");
- img.setAttribute('tooltiptext',
- Bundle().GetStringFromName("similarsite.getsiteinfo"));
- img.setAttribute('src',
- gSettings.httpProtocol + gSettings.staticHost +
- gSettings.bibBug);
- img.addEventListener(
- "mousedown",
- function(e){
- FoxmarksSimSites.showSimSites();
- },
- true
- );
-
- staricon.parentNode.appendChild(img);
- this._iconLoaded = true;
- }
- },
- init: function(){
- this.settings = gSettings;
- if(gSettings.simsiteEnabled){
- this.addIcon();
- }
- var prefs = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefBranch2);
- prefs.addObserver("extensions.xmarks.", this, false);
- },
- clearPanel: function(){
- document.getElementById("foxmarks-ss-progtitle").
- setAttribute("hidden", "true");
- document.getElementById("foxmarks-ss-progress").
- setAttribute("hidden", "false");
- document.getElementById("foxmarks-ss-body").
- setAttribute("hidden", "true");
- },
- onPopupHiding: function(){
- if(this._inflight){
- this._inflight = false;
- SimilarSitesCancel();
- }
- FoxmarksSimSites.detachKeyListener();
- return true;
- },
- _handleKeyListener: function(e){
- // static member; this is undefined
- if(e.metaKey){
- return;
- }
- var panel = document.getElementById("foxmarks-similarsites");
- if(panel){
- panel.hidePopup();
- }
- },
- detachKeyListener: function(){
- var urlbar = document.getElementById("urlbar");
- if(!urlbar){
- return;
- }
- urlbar.removeEventListener("keydown", this._handleKeyListener, true);
- },
- attachKeyListener: function(){
- var urlbar = document.getElementById("urlbar");
- if(!urlbar){
- return;
- }
- urlbar.addEventListener("keydown", this._handleKeyListener, true);
- },
- showSimSites: function(){
- var panel = document.getElementById("foxmarks-similarsites");
- if(panel){
- this.attachKeyListener();
- panel.openPopup(
- document.getElementById("urlbar"),
- "after_end",
- 0,
- 0,
- false,
- false
- );
- var url = gBrowser.selectedBrowser.contentDocument.location.href;
- // remove cache from this version; doesn't work so well
- // if(url == this._cachedURL){
- // this.loadData(this._cachedData);
- //} else {
- this._cachedURL = url;
- this.clearPanel();
- this._inflight = true;
-
- var self = this;
- FetchSimilarSites(
- url,
- document.getElementById("foxmarks-ss-progtitle"),
- document.getElementById("foxmarks-ss-throbber"),
- function(data){
- self._inflight = false;
- FoxmarksSimSites.loadData(data);
- }
- );
- //}
- }
- },
- _cachedURL: "",
- _cachedData: null,
- _setRating: function(info, is_rating){
- var imgname = "rating-0-stars.gif";
- var txt = "";
- var style = "";
- var rating = info ? Math.floor(info.rating * 2) : 0;
- if(info){
- imgname = "rating-" + rating + "-stars.gif";
- switch(info.numreviews){
- case 0:
- txt = Bundle().GetStringFromName("similarsite.noreviews");
- break;
- case 1:
- txt = Bundle().GetStringFromName("similarsite.onereview");
- style = "text-decoration: underline; color: #336699;";
- break;
- default:
- txt = Bundle().formatStringFromName(
- "similarsite.numreviews",
- [info.numreviews.toString()],
- 1
- );
- style = "text-decoration: underline; color: #336699;";
- break;
- }
- } else {
- txt = Bundle().GetStringFromName("similarsite.noreviews");
- }
-
- document.getElementById("foxmarks-ss-ratingimg").
- src = "chrome://foxmarks/skin/images/" + imgname;
- document.getElementById("foxmarks-ss-rating").
- setAttribute("value",txt);
- document.getElementById("foxmarks-ss-rating").
- setAttribute("style",style);
- },
- _setPopularity: function(info, is_rating){
- var imgname = "popularity-0-stars.gif";
- if(info){
- var rating = Math.floor(info.popularity / 10);
- imgname = "popularity-" + rating + "-stars.gif";
- }
-
- document.getElementById("foxmarks-ss-popularimg").
- setAttribute("src",
- "chrome://foxmarks/skin/images/" + imgname);
- },
- _cleanURL: function(url){
- var i = url.indexOf(":");
- if(i > 0){
- return url.substring(i+3);
- }
- return url;
- },
- _appendRelated: function(relatedBox, item, index){
- var container = document.createElement('hbox');
-
- var extstyle = (relatedBox.childNodes.length == 0)?
- "border-top: 1px solid #ccc;" : "";
- container.setAttribute('style',
- "padding: 8px 0px; border-bottom: 1px solid #ccc;" + extstyle);
- container.setAttribute('id',
- "foxmarks-ss-relatedsite." + item.url_id);
- container.setAttribute("crop", "end");
- container.setAttribute("flex", "1");
-
-
- var thumbvbox = document.createElement('vbox');
- var thumb = document.createElement('image');
- thumb.setAttribute("src",
- gSettings.httpProtocol + gSettings.apiHost +
- '/discover/thumbnail/read?cid=xmfx&size=Small&id=' +
- item.url_id
- );
- thumb.setAttribute("style","padding-left: 8px;");
- thumb.setAttribute("width","111");
- thumb.setAttribute("height","82");
- thumbvbox.appendChild(thumb);
- var spacer = document.createElement('spacer');
- spacer.setAttribute('flex', '1');
- thumbvbox.appendChild(spacer);
-
- container.appendChild(thumbvbox);
-
- var vbox = document.createElement('vbox');
- var title = document.createElement('label');
- title.setAttribute('value', this._trim(item.title));
- title.setAttribute('style',
- "font-size: 14px; text-decoration: underline; color: #034E89;");
- title.setAttribute("crop", "end");
- title.setAttribute("flex", "1");
- vbox.setAttribute("flex", "1");
- vbox.appendChild(title);
-
- var desc = document.createElement('description');
- desc.setAttribute("maxwidth", "500");
- desc.setAttribute("flex", "1");
- desc.setAttribute("style", "padding-left: 8px;");
- desc.appendChild(document.createTextNode(item.description));
- vbox.appendChild(desc);
-
- var hbox = document.createElement('hbox');
- var url = document.createElement('label');
- url.setAttribute('value', this._cleanURL(item.url));
- url.setAttribute('style', "color: #7D8F34;padding-right: 0px; margin-right: 0px;");
- url.setAttribute('crop', "end");
- url.setAttribute('flex', "1");
- hbox.setAttribute('crop', "end");
- hbox.setAttribute('flex', "1");
- hbox.appendChild(url);
- var dash = document.createElement('label');
- dash.setAttribute('value', '-');
- dash.setAttribute('style', 'padding: 2px; margin: 0;');
- hbox.appendChild(dash);
- var getinfo = document.createElement('label');
- getinfo.setAttribute('value',
- Bundle().GetStringFromName("similarsite.getsiteinfocaps"));
- getinfo.setAttribute('style',
- "font-size: 10px; font-family:arial,sans-serif; text-decoration: none; color: #0086C3; cursor: pointer; text-tranform: uppercase; margin: 0; padding: 2px 4px 2px 22px; background: transparent url('chrome://foxmarks/skin/images/get-info-18x18.png') no-repeat;");
- getinfo.setAttribute('id',
- "foxmarks-ss-getsiteinfo." + item.url_id);
- hbox.appendChild(getinfo);
- spacer = document.createElement('spacing');
- spacer.setAttribute("flex", "5000");
- hbox.appendChild(spacer);
- spacer = document.createElement('spacing');
- spacer.setAttribute("flex", "1");
- vbox.appendChild(hbox);
- container.appendChild(vbox);
- container.appendChild(spacer);
- var buttonContainer = document.createElement('vbox');
- var spacer2 = document.createElement('spacing');
- spacer2.setAttribute("flex", "1");
- //buttonContainer.appendChild(getinfo);
- buttonContainer.appendChild(spacer2);
- container.appendChild(buttonContainer);
- relatedBox.appendChild(container);
-
- var self =this;
- container.addEventListener('mouseover',
- function(e){
- container.style.background = "#4F8EC9";
- title.style.color = "white";
- desc.style.color = "white";
- dash.style.color = "white";
- getinfo.style.color = "white";
- url.style.color = "white";
- }, false);
- container.addEventListener('mouseout',
- function(e){
- container.style.background = "transparent";
- title.style.color = "#034E89";
- desc.style.color = "black";
- dash.style.color = "black";
- getinfo.style.color = "#0086C3";
- url.style.color = "#7D8F34";
- }, false);
- container.addEventListener('click',
- function(e){
- var panel = document.getElementById("foxmarks-similarsites");
- panel.hidePopup();
- var url =
- gSettings.httpProtocol + gSettings.apiHost +
- self.SIMSITE + item.url_id + "&mid=" +
- gSettings.machineId + "&i=" + index;
- if(e.metaKey){
- gBrowser.selectedTab = gBrowser.addTab(url);
- } else {
- gBrowser.selectedBrowser.contentDocument.location.href =
- url;
- }
- }, false);
- getinfo.addEventListener('click',
- function(e){
- var panel = document.getElementById("foxmarks-similarsites");
- panel.hidePopup();
- e.stopPropagation();
- gBrowser.selectedBrowser.contentDocument.location.href =
- gSettings.httpProtocol + gSettings.driftHost +
- self.DRIFTSITE + encodeURIComponent(item.url);
- }, false);
- },
- _addListeners: function(meta, rating){
- var newreview = document.getElementById("foxmarks-ss-writereview");
- var reviews = document.getElementById("foxmarks-ss-rating");
- var panel = document.getElementById("foxmarks-similarsites");
- var moreinfo = document.getElementById("foxmarks-ss-getsiteinfo");
- reviews.addEventListener(
- "click",
- function(e){
- if(rating && rating.numreviews){
- panel.hidePopup();
- e.stopPropagation();
- gBrowser.selectedBrowser.contentDocument.location.href =
- gSettings.httpProtocol + gSettings.driftHost +
- self.DRIFTSITE + encodeURIComponent(meta.url) + "#r";
- }
- },
- false
- );
- newreview.addEventListener(
- "click",
- function(e){
- panel.hidePopup();
- e.stopPropagation();
- gBrowser.selectedBrowser.contentDocument.location.href =
- gSettings.httpProtocol + gSettings.driftHost +
- self.WRITEREVIEW +
- encodeURIComponent(meta.url);
- },
- false
- );
- var self = this;
- moreinfo.addEventListener(
- "click",
- function(e){
- panel.hidePopup();
- e.stopPropagation();
- gBrowser.selectedBrowser.contentDocument.location.href =
- gSettings.httpProtocol + gSettings.driftHost +
- self.DRIFTSITE +
- encodeURIComponent(meta.url);
- },
- false
- );
- },
- _setTopics: function(topics){
- var container = document.getElementById("foxmarks-ss.topics");
- var len = container.childNodes.length;
- while(len--){
- container.removeChild(container.childNodes[len]);
- }
- var label = document.createElement("label");
- label.setAttribute("value",
- Bundle().GetStringFromName("similarsite.topics")
- );
- label.setAttribute("style",
- "color: #666; font-size: 12px; font-weight: bold; letter-spacing: 1px; width: 82px; padding: 0; margin: 0;");
- container.appendChild(label);
-
- if(!topics || !topics.length){
- var label = document.createElement("label");
- label.setAttribute("value",
- Bundle().GetStringFromName("similarsite.notopics")
- );
- label.setAttribute("style", "padding: 0; margin: 0;font-size: 11px; text-decoration: none; color: black;");
- container.appendChild(label);
- return;
- }
- var len = topics.length;
- if(len > 5) len = 5;
-
-
- for(var x = 0; x < len; x++){
- var label = document.createElement("label");
- label.setAttribute("value", topics[x][0]);
- label.setAttribute("crop", "end");
- label.setAttribute("style", "padding: 0; margin: 0;font-size: 11px; text-decoration: none; color: #034E89;");
- this._setTopicListener(label, topics[x][0]);
- container.appendChild(label);
- if(x + 1 < len){
- var label = document.createElement("label");
- label.setAttribute("value",", " );
- label.setAttribute("crop", "end");
- label.setAttribute("style", "padding: 0; margin: 0;font-size: 11px; color: black;");
- container.appendChild(label);
- }
- }
- },
- _setTopicListener: function(label, topic){
- var self = this;
- label.addEventListener("click",
- function(e){
- var panel = document.getElementById("foxmarks-similarsites");
- panel.hidePopup();
- e.stopPropagation();
- gBrowser.selectedBrowser.contentDocument.location.href =
- gSettings.httpProtocol + gSettings.driftHost +
- self.TOPICSITE + topic;
- },
- false
- );
- label.addEventListener("mouseover",
- function(e){
- label.setAttribute("style",
- "padding: 0; margin: 0;font-size: 11px; text-decoration: underline; color: #034E89;");
- },
- false
- );
- label.addEventListener("mouseout",
- function(e){
- label.setAttribute("style",
- "padding: 0; margin: 0;font-size: 11px; text-decoration: none; color: #034E89;");
- },
- false
- );
- },
- _trim: function(str){
- if(!str)
- return "";
- return str.replace(/^\s*|\s*$/g,'');
- },
- loadData: function(data){
-
- if(data && data.status == 0){
- // this._cachedData = data;
-
- var meta = data.related.urls[this._cachedURL];
- if(meta){
- var id = meta.url_id;
- var related = [x for each (x in meta["related_urls"]) if
- (!x.attrs || !x.attrs.foreign) ];
- var rating = data.rating ? data.rating[id] : null;
- var topics = data.topics ? data.topics.ids[id].topics : null;
- try {
- var title = meta.title.length ? meta.title : meta.url;
- document.getElementById("foxmarks-ss-title").
- setAttribute("value", this._trim(title));
- var desc = document.getElementById("foxmarks-ss-desc");
- while(desc.childNodes.length > 0){
- desc.removeChild(desc.childNodes[0]);
- }
- var descText = document.createTextNode(meta.description);
- desc.appendChild(descText);
- this._setRating(rating);
- this._setPopularity(meta);
-
- // add topics
- this._setTopics(topics);
-
- // add related
- var relatedBox = document.getElementById("foxmarks-ss-related");
- var len = relatedBox.childNodes.length;
- while(len--){
- relatedBox.removeChild(relatedBox.childNodes[len]);
- }
-
- var len = related.length;
- if(len > 5)
- len = 5;
- for(var x = 0; x < len; x++){
- this._appendRelated(relatedBox, related[x], x + 1);
- }
- if(len == 0){
- var label = document.createElement("label");
- label.setAttribute("crop", "end");
- label.setAttribute("value",
- Bundle().GetStringFromName(
- "similarsite.nosimsites")
- );
- label.setAttribute("style",
- "padding: 8px; padding-left: 0px;font-size: 14px; font-weight: bold;"
- );
- relatedBox.appendChild(label);
- }
-
- this._addListeners(meta, rating);
- } catch(e){
- Components.utils.reportError(e);
- }
-
- document.getElementById("foxmarks-ss-progress").
- setAttribute("hidden", "true");
- document.getElementById("foxmarks-ss-body").
- setAttribute("hidden", "false");
- }
- } else {
- var errbox = document.getElementById("foxmarks-ss-progtitle");
-
- errbox.setAttribute("value",
- Bundle().GetStringFromName(
- data.status == 0 || data.status == 400 ?
- "similarsite.nositeinfo" :
- "similarsite.busy"
- )
- );
-
- errbox.setAttribute("hidden", "false");
- }
- }
-
- };
- var FoxmarksSERP = {
- DEBUGSCRIPTURL: "/SERP/gink.js",
- SCRIPTURL: "/SERP/",
- init: function(){
- var domain = Bundle().GetStringFromName("serp.googleintl");
- this.INTL_PATTERN =
- new RegExp("http:\/\/" + domain + "\/.*[?&]q=([^&]+)");
- var appcontent = document.getElementById("appcontent");
- if(appcontent){
- appcontent.addEventListener(
- "DOMContentLoaded",
- function(e){
- if(e.originalTarget.nodeName == "#document"){
- FoxmarksSERP.onPageLoad(e);
- }
- },
- true
- );
- }
- },
- buildScriptURL: function(){
- var lang = gSettings.lang;
- if(gSettings.getDebugOption("serp")){
- return this.DEBUGSCRIPTURL;
- }
-
- if(!lang){
- return this.SCRIPTURL + gSettings.serpPrefix + ".js";
- }
- var langshort = lang.split('-')[0];
-
- if(langshort == "en"){
- return this.SCRIPTURL + gSettings.serpPrefix + ".js";
- }
- var langs = {
- bn: 1, cs: 1, da: 1, de: 1, el: 1, eu: 1, es: 1, fi: 1, fr: 1,
- fy: 1, hu: 1, bg: 1, it: 1, ja: 1, ko: 1, nb: 1, nl: 1, pl: 1,
- ro: 1, ru: 1, sk: 1, sv: 1, tr: 1, uk: 1, vi: 1
- };
-
- if(langshort in langs){
- return "/SERP/" + gSettings.serpPrefix + "." + langshort + ".js";
- }
-
- switch(lang){
- case "pt-BR":
- case "pt-PT":
- case "zh-CN":
- case "zh-TW":
- return "/SERP/" + gSettings.serpPrefix + "." + lang + ".js";
- }
-
- return this.SCRIPTURL + gSettings.serpPrefix + ".js";
- },
- onPageLoad: function(e){
- var doc = e.originalTarget;
- this.doc = doc;
- var rx = new RegExp(gSettings.serpRegex);
- if(gSettings.serpEnabled && doc &&
- doc.location &&
- doc.location.href &&
- rx.test(doc.location.href)
- ){
- doc = doc.defaultView.top.document;
- this.doc = doc;
- var bodytags = doc.getElementsByTagName('body');
- if(bodytags && bodytags.length == 1){
- var field = doc.createElement('input');
- field.setAttribute('type', 'hidden');
- field.setAttribute('id', 'foxmarks.prefs');
- var prefs = [];
- prefs.push("MACHINEID=" + gSettings.machineId);
- prefs.push("NUM_TO_SHOW=" + gSettings.serpMaxItems);
- prefs.push("APIHOST=" + gSettings.apiHost);
- prefs.push("DRIFTHOST=" + gSettings.driftHost);
- prefs.push("STATICHOST=" + gSettings.staticHost);
- if(gSettings.getDebugOption("serp")){
- prefs.push("DEBUG=" + gSettings.getDebugOption("serp"));
- }
- field.setAttribute('value', prefs.join(";"));
- bodytags[0].appendChild(field);
-
- }
- var headtags = doc.getElementsByTagName('head');
- if(headtags && headtags.length == 1){
- var script = doc.createElement('script');
- script.setAttribute('src', "http://"+ gSettings.staticHost +
- this.buildScriptURL()
- );
- headtags[0].appendChild(script);
-
- this.insertST(doc);
- }
- }
- },
- insertST: function(doc){
- var a = doc.getElementsByTagName("a");
- var len = a.length;
- var i;
- var self = this;
-
- this._stData = [];
- if(len == 0){
- return ;
- }
- var found = 10;
- for(var i =0; i < len; i++){
- var item = a[i];
- if(item.className == "l" &&
- item.parentNode && item.parentNode.className == "r" &&
- item.parentNode.nextSibling &&
- (item.parentNode.nextSibling.className== "s" ||
- item.parentNode.nextSibling.tagName == 'SPAN')){
- if(found > 0){
- item.addEventListener("click",
- function(e){
- self.handleClickST(e,doc);
- },
- true
- );
-
- this._stData.push(item);
- found--;
- } else {
- break;
- }
- }
- }
- doc.defaultView.addEventListener("unload",
- function(e){
- self.handleUnloadST(e, doc);
- },
- true
- );
-
- doc.addEventListener("DOMNodeInserted",
- function(e){
- if(e.target && e.target.id == "foxmarks.arrow"){
- self.handleHoverST(e, doc);
-
- }
- },
- false
- );
- },
- _isDec: function(obj){
- var gp = obj.parentNode.parentNode;
- var a = gp.getElementsByTagName('a');
- var len = a.length;
- var token = "foxmarks";
-
- for(var x = 0; x < len ; x++){
- if(a[x].id && a[x].id.substr(0, token.length) == token){
- return true;
- }
- }
-
- return false;
- },
- _hasDec: function(){
- var a = this._stData;
- var len = a.length;
- var x;
- for(x = 0; x < len; x++){
- if(this._isDec(a[x])){
- return true;
- }
- }
-
- return false;
- },
- handleClickST: function(e, doc){
- var a = this._stData;
- var target = e.target;
- var len = a.length;
- var x;
- for(x = 0; x < len; x++){
- if(a[x] === target){
- break;
- }
- }
- if(x < len){
- gSettings.incrST(x, this._isDec(target) ? "dc" : "uc",
- this._hasDec());
- }
-
-
- },
- handleHoverST: function(e, doc){
- var target = e.target.parentNode.parentNode;
- var a = target.getElementsByTagName('a');
- var len = a.length;
- var item = null;
- var x;
- for(x = 0; x < len; x++){
- if(a[x].className == 'l'){
- item = a[x];
- }
- }
- if(item){
- a = this._stData;
- len = a.length;
- for(x = 0; x < len; x++){
- if(a[x] === item){
- gSettings.incrST(x, "h", true);
- return;
- }
- }
- }
- },
- handleUnloadST: function(e, doc){
- var a = this._stData;
- var len = a.length;
- var x;
- var hasDec = this._hasDec();
- for(x = 0; x < len; x++){
- gSettings.incrST(x, this._isDec(a[x]) ? "d" : "u", hasDec);
- }
- for(; x < 10; x++){
- gSettings.incrST(x, "na", hasDec);
- }
-
- if(this.doc){
- var i = this.doc.getElementById("foxmarks.prefsout");
- if(i && i.value){
- gSettings.trSERP = gSettings.trSERP + i.value;
- }
- }
- }
- };
-